package com.zzq.my.jetpacks.jectpackapp.kt

import java.text.DateFormat
import java.text.ParseException
import java.text.SimpleDateFormat
import java.util.*

private const val yyyy_MM_dd_HH_mm_ss = "yyyy-MM-dd HH:mm:ss"
private val SDF_THREAD_LOCAL = ThreadLocal<SimpleDateFormat>()

/**
 * 毫秒转时间字符串
 */
fun Long.toDateString(format: DateFormat = getDefaultFormat()): String {
    return format.format(Date(this))
}

fun Long.toDateString(format: String = yyyy_MM_dd_HH_mm_ss): String {
    return this.toDateString(getDateFormat(format))
}

/**
 * 时间字符串转毫秒
 */
fun String.toMillis(format: DateFormat = getDefaultFormat()): Long {
    return string2Millis(this, format)
}

fun String.toMillis(format: String = yyyy_MM_dd_HH_mm_ss): Long {
    return this.toMillis(getDateFormat(format))
}

private fun string2Millis(time: String, format: DateFormat): Long {
    try {
        return format.parse(time).time
    } catch (e: ParseException) {
        e.printStackTrace()
    }

    return -1
}

private fun getDefaultFormat(): SimpleDateFormat {
    return getDateFormat("yyyy-MM-dd HH:mm:ss")
}

private fun getDateFormat(pattern: String): SimpleDateFormat {
    var simpleDateFormat: SimpleDateFormat? = SDF_THREAD_LOCAL.get()
    if (simpleDateFormat == null) {
        simpleDateFormat = SimpleDateFormat(pattern, Locale.getDefault())
        SDF_THREAD_LOCAL.set(simpleDateFormat)
    } else {
        simpleDateFormat.applyPattern(pattern)
    }
    return simpleDateFormat
}

/**
 * 时间日期相关
 */


/**
 *  日期转换为时间戳
 *  字符串日期格式（比如：2018-4-6)转为毫秒
 *  @param format 时间的格式，默认是按照yyyy-MM-dd HH:mm:ss来转换，如果格式不一样，则需要传入对应的格式
 */
fun String.toDateMills(format: String = "yyyy-MM-dd HH:mm:ss"): Long {

    return try {
        SimpleDateFormat(format, Locale.getDefault()).parse(this).time
    } catch (e: Exception) {
        e.printStackTrace()
        0L
    }

}


// =======================  时间戳转日期 begin ↓ =========================

/**
 * 时间戳转日期
 * Long类型时间戳转为字符串的日期格式
 * @param format 时间的格式，默认是按照yyyy-MM-dd HH:mm:ss来转换，如果格式不一样，则需要传入对应的格式
 */
fun Long.formatDateString(format: String = "yyyy-MM-dd HH:mm:ss"): String {

    return try {

        //秒转毫秒
        var millisecond = this
        //转换PHP时间戳
        if (this.toString().length < 11) {
            millisecond = this * 1000
        }

        SimpleDateFormat(format, Locale.getDefault()).format(Date(millisecond))

    } catch (e: Exception) {
        e.printStackTrace()
        ""
    }

}

/**
 * 时间戳转日期
 * @param format 时间的格式，默认是按照yyyy-MM-dd HH:mm:ss来转换，如果格式不一样，则需要传入对应的格式
 */
fun String.formatDateString(format: String = "yyyy-MM-dd HH:mm:ss"): String {

    return this.toLong().formatDateString(format)

}

/**
 * 时间戳转日期
 * @param format 时间的格式，默认是按照yyyy-MM-dd HH:mm:ss来转换，如果格式不一样，则需要传入对应的格式
 */
fun Int.formatDateString(format: String = "yyyy-MM-dd HH:mm:ss"): String {

    return this.toLong().formatDateString(format)

}